﻿namespace DotNetStar.OpenSDK
{
    using Newtonsoft.Json;
    using System.Net;
    /// <summary>
    /// 表示一个开放平台的 SDK 入口。
    /// </summary>
    public sealed class SDK
    {
        /// <summary>
        /// 阻止使用任何方式初始化 <see cref="SDK"/> 类的新实例。
        /// </summary>
        private SDK()
        {

        }

        /// <summary>
        /// 表示使用 SDK 的开放平台。
        /// </summary>
        public static readonly SDK Use = new SDK();

        /// <summary>
        /// 获取指定的开放平台。
        /// </summary>
        /// <typeparam name="TPlatform">开放平台类型。</typeparam>
        /// <param name="args">必须是相同数量的、对应顺序的、相同类型的构造函数所需要的参数数组。</param>
        /// <returns>指定创建的开放平台类型。</returns>
        public TPlatform GetOpenPlatform<TPlatform>(params object[] args)
            where TPlatform : class, IOpenPlatform
        => Singleton<TPlatform>.CreateInstance(args);

        /// <summary>
        /// 对指定的字符串进行 url 编码。
        /// </summary>
        /// <param name="value">要编码的字符串。</param>
        /// <returns>经过 url 编码的字符串。</returns>
        public static string UrlEncode(string value) => WebUtility.UrlEncode(value);
        /// <summary>
        /// 对已进行 url 编码的字符串进行 url 解码。
        /// </summary>
        /// <param name="encodedValue">已进行 url 编码的字符串。</param>
        /// <returns>经过 url 解码的字符串。</returns>
        public static string UrlDecode(string encodedValue) => WebUtility.UrlDecode(encodedValue);

        /// <summary>
        /// 序列化指定对象成 json 字符串，将忽略任何 null 值或空字符串。
        /// </summary>
        /// <param name="value">要序列化的对象。</param>
        /// <returns>序列化的 json 字符串。</returns>
        public static string Serialize(object value) => JsonConvert.SerializeObject(value, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

        /// <summary>
        /// 反序列化指定的 json 字符串为指定的泛型对象。将忽略任何 null 值或空字符串。
        /// </summary>
        /// <typeparam name="T">反序列化的目标泛型对象。</typeparam>
        /// <param name="jsonStr">反序列化的 json 字符串。</param>
        /// <returns>符合 json 字符串的结构对象。</returns>
        public static T Deserialize<T>(string jsonStr) => JsonConvert.DeserializeObject<T>(jsonStr, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
    }
}
